#version 330
#extension GL_EXT_geometry_shader4 : enable
layout(lines) in;
layout(line_strip) out;
out vec4 exColor;

uniform vec4 inLeftColor;
uniform vec4 inRightColor;

in vec4 leftEyePosition[2];
in vec4 rightEyePosition[2];

void repairLine(in vec4 v1, in vec4 v2, vec4 color)
{
	vec4 back, front;
	// lini za plaszczyzna widzenia nie rysujemy
	if(v1.z < 0.0 && v2.z < 0.0)
		return;	

	if(v1.z > 0.0) // pierwszy punkt jest widoczny
	{
		back = v2;
		front = v1;
	}
	else // drugi punkt jest widoczny
	{
		back = v1;
		front = v2;
	}
	
	// a teraz rysujemy
	gl_Position =front;
	gl_Position.z = 0.0;
	// kolorujemy linie, ktora byla modyfikowana, dzieki temu przy wyswietlanui widzimy ktore linie byly zmieniane
	//exColor = vec3(1.0, 1.0, 0.0);//geomColor[pos];
	exColor = color;
	EmitVertex();

	vec4 dir;
	dir = front - back;
	float factor = -back.z / dir.z;
	dir = dir * factor;
	dir.w = 0.0;
	gl_Position = back + dir;
	gl_Position.z = 0.0;
	gl_Position.w = 0.000001; // poniewaz punkt jest praktycznie na wysokosci obserwatora, wspolczynnik w jest bardzo maly, linie zbieraja do nieskonczonosci
	exColor = color;
	EmitVertex();
	EndPrimitive();
}

void leftEye()
{
	// linie w pelni widoczne, rysujemy normalnie
	if(leftEyePosition[0].z >= 0.0 && leftEyePosition[1].z >= 0.0)
	{
		for(int i=0; i<2; i++)
		{
			gl_Position =leftEyePosition[i];
			gl_Position.z = 0.0;
			//exColor = pPosition[i];
			exColor = inLeftColor; //geomColor[i];
			//exColor = vec3(inProjectionMatrix[2][3], 0.0, 0.0);
			EmitVertex();
		}
		EndPrimitive();
	}
	else
	{
		repairLine(leftEyePosition[0], leftEyePosition[1], inLeftColor);
	}
}

void rightEye()
{
// linie w pelni widoczne, rysujemy normalnie
	if(rightEyePosition[0].z >= 0.0 && rightEyePosition[1].z >= 0.0)
	{

		for(int i=0; i<2; i++)
		{
			gl_Position =rightEyePosition[i];
			gl_Position.z = 0.0;
			//exColor = pPosition[i];
			exColor = inRightColor; //geomColor[i];

			//exColor = vec3(inProjectionMatrix[2][3], 0.0, 0.0);
			EmitVertex();
		}
		EndPrimitive();
	}
	else
	{
		repairLine(rightEyePosition[0], rightEyePosition[1], inRightColor);
	}
}

void main(void)
{
	leftEye();
	rightEye();

	
}